<?php

class ModuleCode extends CCodeModel
{
    public $moduleID;

    public function rules()
    {
        return array_merge(parent::rules(), array(
        array('moduleID', 'filter', 'filter'=>'trim'),
        array('moduleID', 'required'),
        array('moduleID', 'match', 'pattern'=>'/^\w+$/', 'message'=>'{attribute} should only contain word characters.'),
        ));
    }

    public function attributeLabels()
    {
        return array_merge(parent::attributeLabels(), array(
			'moduleID'=>'Module ID',
        ));
    }

    public function successMessage()
    {
        if(Yii::app()->hasModule($this->moduleID))
        return 'The module has been generated successfully. You may '.CHtml::link('try it now', Yii::app()->createUrl($this->moduleID), array('target'=>'_blank')).'.';

        $output=<<<EOD
<p>The module has been generated successfully.</p>
<p>To access the module, you need to modify the application configuration as follows:</p>
EOD;
        $code=<<<EOD
<?php
return array(
    'modules'=>array(
        '{$this->moduleID}',
    ),
    ......
);
EOD;

        return $output.highlight_string($code,true);
    }

    public function prepare()
    {
        $this->files=array();
        $templatePath=$this->templatePath;
        $modulePath=$this->modulePath;
        $moduleTemplateFile=$templatePath.DIRECTORY_SEPARATOR.'module.php';

        $this->files[]=new CCodeFile(
        $modulePath.'/'.$this->moduleClass.'.php',
        $this->render($moduleTemplateFile)
        );

        $files=CFileHelper::findFiles($templatePath,array(
			'exclude'=>array('.svn'),
        ));

        foreach($files as $file)
        {
            if($file!==$moduleTemplateFile)
            {
                if(CFileHelper::getExtension($file)==='php')
                $content=$this->render($file);
                else if(basename($file)==='.yii')  // an empty directory
                {
                    $file=dirname($file);
                    $content=null;
                }
                else
                $content=file_get_contents($file);
                $this->files[]=new CCodeFile(
                $modulePath.substr($file,strlen($templatePath)),
                $content
                );
            }
        }
    }

    public function getModuleClass()
    {
        return ucfirst($this->moduleID).'Module';
    }

    public function getModulePath()
    {
        return Yii::app()->modulePath.DIRECTORY_SEPARATOR.$this->moduleID;
    }
}